home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / dev / gg / openssl-bin.lha / ssl / include / openssl / pem.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-08  |  23.5 KB  |  666 lines

  1. /* crypto/pem/pem.h */
  2. /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
  3.  * All rights reserved.
  4.  *
  5.  * This package is an SSL implementation written
  6.  * by Eric Young (eay@cryptsoft.com).
  7.  * The implementation was written so as to conform with Netscapes SSL.
  8.  * 
  9.  * This library is free for commercial and non-commercial use as long as
  10.  * the following conditions are aheared to.  The following conditions
  11.  * apply to all code found in this distribution, be it the RC4, RSA,
  12.  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
  13.  * included with this distribution is covered by the same copyright terms
  14.  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15.  * 
  16.  * Copyright remains Eric Young's, and as such any Copyright notices in
  17.  * the code are not to be removed.
  18.  * If this package is used in a product, Eric Young should be given attribution
  19.  * as the author of the parts of the library used.
  20.  * This can be in the form of a textual message at program startup or
  21.  * in documentation (online or textual) provided with the package.
  22.  * 
  23.  * Redistribution and use in source and binary forms, with or without
  24.  * modification, are permitted provided that the following conditions
  25.  * are met:
  26.  * 1. Redistributions of source code must retain the copyright
  27.  *    notice, this list of conditions and the following disclaimer.
  28.  * 2. Redistributions in binary form must reproduce the above copyright
  29.  *    notice, this list of conditions and the following disclaimer in the
  30.  *    documentation and/or other materials provided with the distribution.
  31.  * 3. All advertising materials mentioning features or use of this software
  32.  *    must display the following acknowledgement:
  33.  *    "This product includes cryptographic software written by
  34.  *     Eric Young (eay@cryptsoft.com)"
  35.  *    The word 'cryptographic' can be left out if the rouines from the library
  36.  *    being used are not cryptographic related :-).
  37.  * 4. If you include any Windows specific code (or a derivative thereof) from 
  38.  *    the apps directory (application code) you must include an acknowledgement:
  39.  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40.  * 
  41.  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51.  * SUCH DAMAGE.
  52.  * 
  53.  * The licence and distribution terms for any publically available version or
  54.  * derivative of this code cannot be changed.  i.e. this code cannot simply be
  55.  * copied and put under another distribution licence
  56.  * [including the GNU Public Licence.]
  57.  */
  58.  
  59. #ifndef HEADER_PEM_H
  60. #define HEADER_PEM_H
  61.  
  62. #ifndef NO_BIO
  63. #include <openssl/bio.h>
  64. #endif
  65. #ifndef NO_STACK
  66. #include <openssl/stack.h>
  67. #endif
  68. #include <openssl/evp.h>
  69. #include <openssl/x509.h>
  70. #include <openssl/pem2.h>
  71.  
  72. #ifdef  __cplusplus
  73. extern "C" {
  74. #endif
  75.  
  76. #define PEM_BUFSIZE        1024
  77.  
  78. #define PEM_OBJ_UNDEF        0
  79. #define PEM_OBJ_X509        1
  80. #define PEM_OBJ_X509_REQ    2
  81. #define PEM_OBJ_CRL        3
  82. #define PEM_OBJ_SSL_SESSION    4
  83. #define PEM_OBJ_PRIV_KEY    10
  84. #define PEM_OBJ_PRIV_RSA    11
  85. #define PEM_OBJ_PRIV_DSA    12
  86. #define PEM_OBJ_PRIV_DH        13
  87. #define PEM_OBJ_PUB_RSA        14
  88. #define PEM_OBJ_PUB_DSA        15
  89. #define PEM_OBJ_PUB_DH        16
  90. #define PEM_OBJ_DHPARAMS    17
  91. #define PEM_OBJ_DSAPARAMS    18
  92. #define PEM_OBJ_PRIV_RSA_PUBLIC    19
  93.  
  94. #define PEM_ERROR        30
  95. #define PEM_DEK_DES_CBC         40
  96. #define PEM_DEK_IDEA_CBC        45
  97. #define PEM_DEK_DES_EDE         50
  98. #define PEM_DEK_DES_ECB         60
  99. #define PEM_DEK_RSA             70
  100. #define PEM_DEK_RSA_MD2         80
  101. #define PEM_DEK_RSA_MD5         90
  102.  
  103. #define PEM_MD_MD2        NID_md2
  104. #define PEM_MD_MD5        NID_md5
  105. #define PEM_MD_SHA        NID_sha
  106. #define PEM_MD_MD2_RSA        NID_md2WithRSAEncryption
  107. #define PEM_MD_MD5_RSA        NID_md5WithRSAEncryption
  108. #define PEM_MD_SHA_RSA        NID_sha1WithRSAEncryption
  109.  
  110. #define PEM_STRING_X509_OLD    "X509 CERTIFICATE"
  111. #define PEM_STRING_X509        "CERTIFICATE"
  112. #define PEM_STRING_X509_TRUSTED    "TRUSTED CERTIFICATE"
  113. #define PEM_STRING_X509_REQ_OLD    "NEW CERTIFICATE REQUEST"
  114. #define PEM_STRING_X509_REQ    "CERTIFICATE REQUEST"
  115. #define PEM_STRING_X509_CRL    "X509 CRL"
  116. #define PEM_STRING_EVP_PKEY    "ANY PRIVATE KEY"
  117. #define PEM_STRING_PUBLIC    "PUBLIC KEY"
  118. #define PEM_STRING_RSA        "RSA PRIVATE KEY"
  119. #define PEM_STRING_RSA_PUBLIC    "RSA PUBLIC KEY"
  120. #define PEM_STRING_DSA        "DSA PRIVATE KEY"
  121. #define PEM_STRING_DSA_PUBLIC    "DSA PUBLIC KEY"
  122. #define PEM_STRING_PKCS7    "PKCS7"
  123. #define PEM_STRING_PKCS8    "ENCRYPTED PRIVATE KEY"
  124. #define PEM_STRING_PKCS8INF    "PRIVATE KEY"
  125. #define PEM_STRING_DHPARAMS    "DH PARAMETERS"
  126. #define PEM_STRING_SSL_SESSION    "SSL SESSION PARAMETERS"
  127. #define PEM_STRING_DSAPARAMS    "DSA PARAMETERS"
  128.  
  129.  
  130. typedef struct PEM_Encode_Seal_st
  131.     {
  132.     EVP_ENCODE_CTX encode;
  133.     EVP_MD_CTX md;
  134.     EVP_CIPHER_CTX cipher;
  135.     } PEM_ENCODE_SEAL_CTX;
  136.  
  137. /* enc_type is one off */
  138. #define PEM_TYPE_ENCRYPTED      10
  139. #define PEM_TYPE_MIC_ONLY       20
  140. #define PEM_TYPE_MIC_CLEAR      30
  141. #define PEM_TYPE_CLEAR        40
  142.  
  143. typedef struct pem_recip_st
  144.     {
  145.     char *name;
  146.     X509_NAME *dn;
  147.  
  148.     int cipher;
  149.     int key_enc;
  150.     char iv[8];
  151.     } PEM_USER;
  152.  
  153. typedef struct pem_ctx_st
  154.     {
  155.     int type;        /* what type of object */
  156.  
  157.     struct    {
  158.         int version;    
  159.         int mode;        
  160.         } proc_type;
  161.  
  162.     char *domain;
  163.  
  164.     struct    {
  165.         int cipher;
  166.         unsigned char iv[8];
  167.         } DEK_info;
  168.         
  169.     PEM_USER *originator;
  170.  
  171.     int num_recipient;
  172.     PEM_USER **recipient;
  173.  
  174. #ifndef NO_STACK
  175.     STACK *x509_chain;    /* certificate chain */
  176. #else
  177.     char *x509_chain;    /* certificate chain */
  178. #endif
  179.     EVP_MD *md;        /* signature type */
  180.  
  181.     int md_enc;        /* is the md encrypted or not? */
  182.     int md_len;        /* length of md_data */
  183.     char *md_data;        /* message digest, could be pkey encrypted */
  184.  
  185.     EVP_CIPHER *dec;    /* date encryption cipher */
  186.     int key_len;        /* key length */
  187.     unsigned char *key;    /* key */
  188.     unsigned char iv[8];    /* the iv */
  189.  
  190.     
  191.     int  data_enc;        /* is the data encrypted */
  192.     int data_len;
  193.     unsigned char *data;
  194.     } PEM_CTX;
  195.  
  196. /* These macros make the PEM_read/PEM_write functions easier to maintain and
  197.  * write. Now they are all implemented with either:
  198.  * IMPLEMENT_PEM_rw(...) or IMPLEMENT_PEM_rw_cb(...)
  199.  */
  200.  
  201. #ifdef NO_FP_API
  202.  
  203. #define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/
  204. #define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/
  205. #define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/
  206.  
  207. #else
  208.  
  209. #define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \
  210. type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\
  211. { \
  212. return((type *)PEM_ASN1_read((char *(*)())d2i_##asn1, str,fp,(char **)x,\
  213.     cb,u)); \
  214. } \
  215.  
  216. #define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \
  217. int PEM_write_##name(FILE *fp, type *x) \
  218. { \
  219. return(PEM_ASN1_write((int (*)())i2d_##asn1,str,fp, (char *)x, \
  220.                              NULL,NULL,0,NULL,NULL)); \
  221.  
  222. #define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \
  223. int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \
  224.          unsigned char *kstr, int klen, pem_password_cb *cb, \
  225.           void *u) \
  226.     { \
  227.     return(PEM_ASN1_write((int (*)())i2d_##asn1,str,fp, \
  228.         (char *)x,enc,kstr,klen,cb,u)); \
  229.     }
  230.  
  231. #endif
  232.  
  233. #define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \
  234. type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\
  235. { \
  236. return((type *)PEM_ASN1_read_bio((char *(*)())d2i_##asn1, str,bp,\
  237.                             (char **)x,cb,u)); \
  238. }
  239.  
  240. #define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \
  241. int PEM_write_bio_##name(BIO *bp, type *x) \
  242. { \
  243. return(PEM_ASN1_write_bio((int (*)())i2d_##asn1,str,bp, (char *)x, \
  244.                              NULL,NULL,0,NULL,NULL)); \
  245. }
  246.  
  247. #define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \
  248. int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \
  249.          unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \
  250.     { \
  251.     return(PEM_ASN1_write_bio((int (*)())i2d_##asn1,str,bp, \
  252.         (char *)x,enc,kstr,klen,cb,u)); \
  253.     }
  254.  
  255. #define IMPLEMENT_PEM_write(name, type, str, asn1) \
  256.     IMPLEMENT_PEM_write_bio(name, type, str, asn1) \
  257.     IMPLEMENT_PEM_write_fp(name, type, str, asn1) 
  258.  
  259. #define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \
  260.     IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \
  261.     IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) 
  262.  
  263. #define IMPLEMENT_PEM_read(name, type, str, asn1) \
  264.     IMPLEMENT_PEM_read_bio(name, type, str, asn1) \
  265.     IMPLEMENT_PEM_read_fp(name, type, str, asn1) 
  266.  
  267. #define IMPLEMENT_PEM_rw(name, type, str, asn1) \
  268.     IMPLEMENT_PEM_read(name, type, str, asn1) \
  269.     IMPLEMENT_PEM_write(name, type, str, asn1)
  270.  
  271. #define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \
  272.     IMPLEMENT_PEM_read(name, type, str, asn1) \
  273.     IMPLEMENT_PEM_write_cb(name, type, str, asn1)
  274.  
  275. /* These are the same except they are for the declarations */
  276.  
  277. #if defined(WIN16) || defined(NO_FP_API)
  278.  
  279. #define DECLARE_PEM_read_fp(name, type) /**/
  280. #define DECLARE_PEM_write_fp(name, type) /**/
  281. #define DECLARE_PEM_write_cb_fp(name, type) /**/
  282.  
  283. #else
  284.  
  285. #define DECLARE_PEM_read_fp(name, type) \
  286.     type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u);
  287.  
  288. #define DECLARE_PEM_write_fp(name, type) \
  289.     int PEM_write_##name(FILE *fp, type *x);
  290.  
  291. #define DECLARE_PEM_write_cb_fp(name, type) \
  292.     int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \
  293.          unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
  294.  
  295. #endif
  296.  
  297. #ifndef NO_BIO
  298. #define DECLARE_PEM_read_bio(name, type) \
  299.     type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u);
  300.  
  301. #define DECLARE_PEM_write_bio(name, type) \
  302.     int PEM_write_bio_##name(BIO *bp, type *x);
  303.  
  304. #define DECLARE_PEM_write_cb_bio(name, type) \
  305.     int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \
  306.          unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
  307.  
  308. #else
  309.  
  310. #define DECLARE_PEM_read_bio(name, type) /**/
  311. #define DECLARE_PEM_write_bio(name, type) /**/
  312. #define DECLARE_PEM_write_cb_bio(name, type) /**/
  313.  
  314. #endif
  315.  
  316. #define DECLARE_PEM_write(name, type) \
  317.     DECLARE_PEM_write_bio(name, type) \
  318.     DECLARE_PEM_write_fp(name, type) 
  319.  
  320. #define DECLARE_PEM_write_cb(name, type) \
  321.     DECLARE_PEM_write_cb_bio(name, type) \
  322.     DECLARE_PEM_write_cb_fp(name, type) 
  323.  
  324. #define DECLARE_PEM_read(name, type) \
  325.     DECLARE_PEM_read_bio(name, type) \
  326.     DECLARE_PEM_read_fp(name, type)
  327.  
  328. #define DECLARE_PEM_rw(name, type) \
  329.     DECLARE_PEM_read(name, type) \
  330.     DECLARE_PEM_write(name, type)
  331.  
  332. #define DECLARE_PEM_rw_cb(name, type) \
  333.     DECLARE_PEM_read(name, type) \
  334.     DECLARE_PEM_write_cb(name, type)
  335.  
  336. #ifdef SSLEAY_MACROS
  337.  
  338. #define PEM_write_SSL_SESSION(fp,x) \
  339.         PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \
  340.             PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL)
  341. #define PEM_write_X509(fp,x) \
  342.         PEM_ASN1_write((int (*)())i2d_X509,PEM_STRING_X509,fp, \
  343.             (char *)x, NULL,NULL,0,NULL,NULL)
  344. #define PEM_write_X509_REQ(fp,x) PEM_ASN1_write( \
  345.         (int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,fp,(char *)x, \
  346.             NULL,NULL,0,NULL,NULL)
  347. #define PEM_write_X509_CRL(fp,x) \
  348.         PEM_ASN1_write((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL, \
  349.             fp,(char *)x, NULL,NULL,0,NULL,NULL)
  350. #define    PEM_write_RSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \
  351.         PEM_ASN1_write((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,fp,\
  352.             (char *)x,enc,kstr,klen,cb,u)
  353. #define    PEM_write_RSAPublicKey(fp,x) \
  354.         PEM_ASN1_write((int (*)())i2d_RSAPublicKey,\
  355.             PEM_STRING_RSA_PUBLIC,fp,(char *)x,NULL,NULL,0,NULL,NULL)
  356. #define    PEM_write_DSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \
  357.         PEM_ASN1_write((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,fp,\
  358.             (char *)x,enc,kstr,klen,cb,u)
  359. #define    PEM_write_PrivateKey(bp,x,enc,kstr,klen,cb,u) \
  360.         PEM_ASN1_write((int (*)())i2d_PrivateKey,\
  361.         (((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\
  362.             bp,(char *)x,enc,kstr,klen,cb,u)
  363. #define PEM_write_PKCS7(fp,x) \
  364.         PEM_ASN1_write((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,fp, \
  365.             (char *)x, NULL,NULL,0,NULL,NULL)
  366. #define PEM_write_DHparams(fp,x) \
  367.         PEM_ASN1_write((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,fp,\
  368.             (char *)x,NULL,NULL,0,NULL,NULL)
  369.  
  370. #define PEM_write_NETSCAPE_CERT_SEQUENCE(fp,x) \
  371.                 PEM_ASN1_write((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \
  372.             PEM_STRING_X509,fp, \
  373.                         (char *)x, NULL,NULL,0,NULL,NULL)
  374.  
  375. #define    PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \
  376.     (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u)
  377. #define    PEM_read_X509(fp,x,cb,u) (X509 *)PEM_ASN1_read( \
  378.     (char *(*)())d2i_X509,PEM_STRING_X509,fp,(char **)x,cb,u)
  379. #define    PEM_read_X509_REQ(fp,x,cb,u) (X509_REQ *)PEM_ASN1_read( \
  380.     (char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,fp,(char **)x,cb,u)
  381. #define    PEM_read_X509_CRL(fp,x,cb,u) (X509_CRL *)PEM_ASN1_read( \
  382.     (char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,fp,(char **)x,cb,u)
  383. #define    PEM_read_RSAPrivateKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
  384.     (char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,fp,(char **)x,cb,u)
  385. #define    PEM_read_RSAPublicKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
  386.     (char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,fp,(char **)x,cb,u)
  387. #define    PEM_read_DSAPrivateKey(fp,x,cb,u) (DSA *)PEM_ASN1_read( \
  388.     (char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,fp,(char **)x,cb,u)
  389. #define    PEM_read_PrivateKey(fp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read( \
  390.     (char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,fp,(char **)x,cb,u)
  391. #define    PEM_read_PKCS7(fp,x,cb,u) (PKCS7 *)PEM_ASN1_read( \
  392.     (char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,fp,(char **)x,cb,u)
  393. #define    PEM_read_DHparams(fp,x,cb,u) (DH *)PEM_ASN1_read( \
  394.     (char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,fp,(char **)x,cb,u)
  395.  
  396. #define PEM_read_NETSCAPE_CERT_SEQUENCE(fp,x,cb,u) \
  397.         (NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read( \
  398.         (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,fp,\
  399.                             (char **)x,cb,u)
  400.  
  401. #define PEM_write_bio_SSL_SESSION(bp,x) \
  402.         PEM_ASN1_write_bio((int (*)())i2d_SSL_SESSION, \
  403.             PEM_STRING_SSL_SESSION,bp, (char *)x, NULL,NULL,0,NULL,NULL)
  404. #define PEM_write_bio_X509(bp,x) \
  405.         PEM_ASN1_write_bio((int (*)())i2d_X509,PEM_STRING_X509,bp, \
  406.             (char *)x, NULL,NULL,0,NULL,NULL)
  407. #define PEM_write_bio_X509_REQ(bp,x) PEM_ASN1_write_bio( \
  408.         (int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,bp,(char *)x, \
  409.             NULL,NULL,0,NULL,NULL)
  410. #define PEM_write_bio_X509_CRL(bp,x) \
  411.         PEM_ASN1_write_bio((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL,\
  412.             bp,(char *)x, NULL,NULL,0,NULL,NULL)
  413. #define    PEM_write_bio_RSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \
  414.         PEM_ASN1_write_bio((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,\
  415.             bp,(char *)x,enc,kstr,klen,cb,u)
  416. #define    PEM_write_bio_RSAPublicKey(bp,x) \
  417.         PEM_ASN1_write_bio((int (*)())i2d_RSAPublicKey, \
  418.             PEM_STRING_RSA_PUBLIC,\
  419.             bp,(char *)x,NULL,NULL,0,NULL,NULL)
  420. #define    PEM_write_bio_DSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \
  421.         PEM_ASN1_write_bio((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,\
  422.             bp,(char *)x,enc,kstr,klen,cb,u)
  423. #define    PEM_write_bio_PrivateKey(bp,x,enc,kstr,klen,cb,u) \
  424.         PEM_ASN1_write_bio((int (*)())i2d_PrivateKey,\
  425.         (((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\
  426.             bp,(char *)x,enc,kstr,klen,cb,u)
  427. #define PEM_write_bio_PKCS7(bp,x) \
  428.         PEM_ASN1_write_bio((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,bp, \
  429.             (char *)x, NULL,NULL,0,NULL,NULL)
  430. #define PEM_write_bio_DHparams(bp,x) \
  431.         PEM_ASN1_write_bio((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,\
  432.             bp,(char *)x,NULL,NULL,0,NULL,NULL)
  433. #define PEM_write_bio_DSAparams(bp,x) \
  434.         PEM_ASN1_write_bio((int (*)())i2d_DSAparams, \
  435.             PEM_STRING_DSAPARAMS,bp,(char *)x,NULL,NULL,0,NULL,NULL)
  436.  
  437. #define PEM_write_bio_NETSCAPE_CERT_SEQUENCE(bp,x) \
  438.                 PEM_ASN1_write_bio((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \
  439.             PEM_STRING_X509,bp, \
  440.                         (char *)x, NULL,NULL,0,NULL,NULL)
  441.  
  442. #define    PEM_read_bio_SSL_SESSION(bp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read_bio( \
  443.     (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,(char **)x,cb,u)
  444. #define    PEM_read_bio_X509(bp,x,cb,u) (X509 *)PEM_ASN1_read_bio( \
  445.     (char *(*)())d2i_X509,PEM_STRING_X509,bp,(char **)x,cb,u)
  446. #define    PEM_read_bio_X509_REQ(bp,x,cb,u) (X509_REQ *)PEM_ASN1_read_bio( \
  447.     (char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,bp,(char **)x,cb,u)
  448. #define    PEM_read_bio_X509_CRL(bp,x,cb,u) (X509_CRL *)PEM_ASN1_read_bio( \
  449.     (char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,bp,(char **)x,cb,u)
  450. #define    PEM_read_bio_RSAPrivateKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
  451.     (char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,bp,(char **)x,cb,u)
  452. #define    PEM_read_bio_RSAPublicKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
  453.     (char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,bp,(char **)x,cb,u)
  454. #define    PEM_read_bio_DSAPrivateKey(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \
  455.     (char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,bp,(char **)x,cb,u)
  456. #define    PEM_read_bio_PrivateKey(bp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read_bio( \
  457.     (char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,bp,(char **)x,cb,u)
  458.  
  459. #define    PEM_read_bio_PKCS7(bp,x,cb,u) (PKCS7 *)PEM_ASN1_read_bio( \
  460.     (char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,bp,(char **)x,cb,u)
  461. #define    PEM_read_bio_DHparams(bp,x,cb,u) (DH *)PEM_ASN1_read_bio( \
  462.     (char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,bp,(char **)x,cb,u)
  463. #define    PEM_read_bio_DSAparams(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \
  464.     (char *(*)())d2i_DSAparams,PEM_STRING_DSAPARAMS,bp,(char **)x,cb,u)
  465.  
  466. #define PEM_read_bio_NETSCAPE_CERT_SEQUENCE(bp,x,cb,u) \
  467.         (NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read_bio( \
  468.         (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,bp,\
  469.                             (char **)x,cb,u)
  470.  
  471. #endif
  472.  
  473. #if 1
  474. /* "userdata": new with OpenSSL 0.9.4 */
  475. typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata);
  476. #else
  477. /* OpenSSL 0.9.3, 0.9.3a */
  478. typedef int pem_password_cb(char *buf, int size, int rwflag);
  479. #endif
  480.  
  481. int    PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher);
  482. int    PEM_do_header (EVP_CIPHER_INFO *cipher, unsigned char *data,long *len,
  483.     pem_password_cb *callback,void *u);
  484.  
  485. #ifndef NO_BIO
  486. int    PEM_read_bio(BIO *bp, char **name, char **header,
  487.         unsigned char **data,long *len);
  488. int    PEM_write_bio(BIO *bp,const char *name,char *hdr,unsigned char *data,
  489.         long len);
  490. char *    PEM_ASN1_read_bio(char *(*d2i)(),const char *name,BIO *bp,char **x,
  491.         pem_password_cb *cb, void *u);
  492. int    PEM_ASN1_write_bio(int (*i2d)(),const char *name,BIO *bp,char *x,
  493.                const EVP_CIPHER *enc,unsigned char *kstr,int klen,
  494.                pem_password_cb *cb, void *u);
  495. STACK_OF(X509_INFO) *    PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u);
  496. int    PEM_X509_INFO_write_bio(BIO *bp,X509_INFO *xi, EVP_CIPHER *enc,
  497.         unsigned char *kstr, int klen, pem_password_cb *cd, void *u);
  498. #endif
  499.  
  500. #ifndef WIN16
  501. int    PEM_read(FILE *fp, char **name, char **header,
  502.         unsigned char **data,long *len);
  503. int    PEM_write(FILE *fp,char *name,char *hdr,unsigned char *data,long len);
  504. char *    PEM_ASN1_read(char *(*d2i)(),const char *name,FILE *fp,char **x,
  505.     pem_password_cb *cb, void *u);
  506. int    PEM_ASN1_write(int (*i2d)(),const char *name,FILE *fp,char *x,
  507.                const EVP_CIPHER *enc,unsigned char *kstr,int klen,
  508.                pem_password_cb *callback, void *u);
  509. STACK_OF(X509_INFO) *    PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk,
  510.     pem_password_cb *cb, void *u);
  511. #endif
  512.  
  513. int    PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type,
  514.         EVP_MD *md_type, unsigned char **ek, int *ekl,
  515.         unsigned char *iv, EVP_PKEY **pubk, int npubk);
  516. void    PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl,
  517.         unsigned char *in, int inl);
  518. int    PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig,int *sigl,
  519.         unsigned char *out, int *outl, EVP_PKEY *priv);
  520.  
  521. void    PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type);
  522. void    PEM_SignUpdate(EVP_MD_CTX *ctx,unsigned char *d,unsigned int cnt);
  523. int    PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret,
  524.         unsigned int *siglen, EVP_PKEY *pkey);
  525.  
  526. void    PEM_proc_type(char *buf, int type);
  527. void    PEM_dek_info(char *buf, const char *type, int len, char *str);
  528.  
  529. #ifndef SSLEAY_MACROS
  530.  
  531. #include <openssl/symhacks.h>
  532.  
  533. DECLARE_PEM_rw(X509, X509)
  534.  
  535. DECLARE_PEM_rw(X509_AUX, X509)
  536.  
  537. DECLARE_PEM_rw(X509_REQ, X509_REQ)
  538. DECLARE_PEM_write(X509_REQ_NEW, X509_REQ)
  539.  
  540. DECLARE_PEM_rw(X509_CRL, X509_CRL)
  541.  
  542. DECLARE_PEM_rw(PKCS7, PKCS7)
  543.  
  544. DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE)
  545.  
  546. DECLARE_PEM_rw(PKCS8, X509_SIG)
  547.  
  548. DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO)
  549.  
  550. #ifndef NO_RSA
  551.  
  552. DECLARE_PEM_rw_cb(RSAPrivateKey, RSA)
  553.  
  554. DECLARE_PEM_rw(RSAPublicKey, RSA)
  555. DECLARE_PEM_rw(RSA_PUBKEY, RSA)
  556.  
  557. #endif
  558.  
  559. #ifndef NO_DSA
  560.  
  561. DECLARE_PEM_rw_cb(DSAPrivateKey, DSA)
  562.  
  563. DECLARE_PEM_rw(DSA_PUBKEY, DSA)
  564.  
  565. DECLARE_PEM_rw(DSAparams, DSA)
  566.  
  567. #endif
  568.  
  569. #ifndef NO_DH
  570.  
  571. DECLARE_PEM_rw(DHparams, DH)
  572.  
  573. #endif
  574.  
  575. DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY)
  576.  
  577. DECLARE_PEM_rw(PUBKEY, EVP_PKEY)
  578.  
  579. int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid,
  580.                   char *kstr, int klen,
  581.                   pem_password_cb *cb, void *u);
  582. int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *,
  583.                                   char *, int, pem_password_cb *, void *);
  584. int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
  585.                   char *kstr, int klen,
  586.                   pem_password_cb *cb, void *u);
  587. int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid,
  588.                   char *kstr, int klen,
  589.                   pem_password_cb *cb, void *u);
  590. EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);
  591.  
  592. int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
  593.                   char *kstr, int klen,
  594.                   pem_password_cb *cb, void *u);
  595. int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid,
  596.                   char *kstr, int klen,
  597.                   pem_password_cb *cb, void *u);
  598. int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid,
  599.                   char *kstr, int klen,
  600.                   pem_password_cb *cb, void *u);
  601.  
  602. EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u);
  603.  
  604. int PEM_write_PKCS8PrivateKey(FILE *fp,EVP_PKEY *x,const EVP_CIPHER *enc,
  605.                   char *kstr,int klen, pem_password_cb *cd, void *u);
  606.  
  607. #endif /* SSLEAY_MACROS */
  608.  
  609.  
  610. /* BEGIN ERROR CODES */
  611. /* The following lines are auto generated by the script mkerr.pl. Any changes
  612.  * made after this point may be overwritten when the script is next run.
  613.  */
  614. void ERR_load_PEM_strings(void);
  615.  
  616. /* Error codes for the PEM functions. */
  617.  
  618. /* Function codes. */
  619. #define PEM_F_D2I_PKCS8PRIVATEKEY_BIO             120
  620. #define PEM_F_D2I_PKCS8PRIVATEKEY_FP             121
  621. #define PEM_F_DEF_CALLBACK                 100
  622. #define PEM_F_LOAD_IV                     101
  623. #define PEM_F_PEM_ASN1_READ                 102
  624. #define PEM_F_PEM_ASN1_READ_BIO                 103
  625. #define PEM_F_PEM_ASN1_WRITE                 104
  626. #define PEM_F_PEM_ASN1_WRITE_BIO             105
  627. #define PEM_F_PEM_DO_HEADER                 106
  628. #define PEM_F_PEM_F_DO_PK8KEY_FP             122
  629. #define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY         118
  630. #define PEM_F_PEM_GET_EVP_CIPHER_INFO             107
  631. #define PEM_F_PEM_READ                     108
  632. #define PEM_F_PEM_READ_BIO                 109
  633. #define PEM_F_PEM_SEALFINAL                 110
  634. #define PEM_F_PEM_SEALINIT                 111
  635. #define PEM_F_PEM_SIGNFINAL                 112
  636. #define PEM_F_PEM_WRITE                     113
  637. #define PEM_F_PEM_WRITE_BIO                 114
  638. #define PEM_F_PEM_WRITE_BIO_PKCS8PRIVATEKEY         119
  639. #define PEM_F_PEM_X509_INFO_READ             115
  640. #define PEM_F_PEM_X509_INFO_READ_BIO             116
  641. #define PEM_F_PEM_X509_INFO_WRITE_BIO             117
  642.  
  643. /* Reason codes. */
  644. #define PEM_R_BAD_BASE64_DECODE                 100
  645. #define PEM_R_BAD_DECRYPT                 101
  646. #define PEM_R_BAD_END_LINE                 102
  647. #define PEM_R_BAD_IV_CHARS                 103
  648. #define PEM_R_BAD_PASSWORD_READ                 104
  649. #define PEM_R_ERROR_CONVERTING_PRIVATE_KEY         115
  650. #define PEM_R_NOT_DEK_INFO                 105
  651. #define PEM_R_NOT_ENCRYPTED                 106
  652. #define PEM_R_NOT_PROC_TYPE                 107
  653. #define PEM_R_NO_START_LINE                 108
  654. #define PEM_R_PROBLEMS_GETTING_PASSWORD             109
  655. #define PEM_R_PUBLIC_KEY_NO_RSA                 110
  656. #define PEM_R_READ_KEY                     111
  657. #define PEM_R_SHORT_HEADER                 112
  658. #define PEM_R_UNSUPPORTED_CIPHER             113
  659. #define PEM_R_UNSUPPORTED_ENCRYPTION             114
  660.  
  661. #ifdef  __cplusplus
  662. }
  663. #endif
  664. #endif
  665.